# -*- coding: UTF-8 -*-

import operator
import numpy as np
import pandas as pd

data = pd.read_csv('课程报告数据集/diabetes_discrete.data', sep=' ', names=[i for i in range(590)])
data = np.array(data)

import matplotlib.pyplot as plt
"""
    group - 数据集
    labels - 分类标签
"""

# 数据预处理
group=[]
label=[]
for i in range(len(data)):
    temp=[]
    for j in range(len(data[0])):
        if data[i][j]>=0:
            temp.append(int(data[i][j]))
    label.append(temp[-1])
    group.append(temp[:-1])

test=group
group=np.array(group)


"""
函数说明:kNN算法,分类器

Parameters:
    inX - 用于分类的数据(测试集)
    dataSet - 用于训练的数据(训练集)
    labes - 分类标签
    k - kNN算法参数,选择距离最小的k个点
Returns:
    sortedClassCount[0][0] - 分类结果

Modify:
    2017-07-13
"""
def classify0(inX, dataSet, labels, k):
    #numpy函数shape[0]返回dataSet的行数
    dataSetSize = dataSet.shape[0]
    #在列向量方向上重复inX共1次(横向)，行向量方向上重复inX共dataSetSize次(纵向)
    diffMat = np.tile(inX, (dataSetSize, 1)) - dataSet
    #二维特征相减后平方
    sqDiffMat = diffMat**2
    #sum()所有元素相加，sum(0)列相加，sum(1)行相加
    sqDistances = sqDiffMat.sum(axis=1)
    #开方，计算出距离
    distances = sqDistances**0.5
    #返回distances中元素从小到大排序后的索引值
    sortedDistIndices = distances.argsort()
    #定一个记录类别次数的字典
    classCount = {}
    for i in range(k):
        #取出前k个元素的类别
        voteIlabel = labels[sortedDistIndices[i]]
        #dict.get(key,default=None),字典的get()方法,返回指定键的值,如果值不在字典中返回默认值。
        #计算类别次数
        classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1
    #python3中用items()替换python2中的iteritems()
    #key=operator.itemgetter(1)根据字典的值进行排序
    #key=operator.itemgetter(0)根据字典的键进行排序
    #reverse降序排序字典
    sortedClassCount = sorted(classCount.items(),key=operator.itemgetter(1),reverse=True)
    #返回次数最多的类别,即所要分类的类别
    return sortedClassCount[0][0]

# 训练集大小
l=500
#训练数据集
group, labels = group[0:l],label[0:l]

#测试集
group_test=test[l:]
label_test=label[l:]

x,y=[],[]
for index,k in enumerate((1,3,5,7,9,11,13,15)):
    #kNN分类
    cnt=0
    for i in range(len(group_test)):
        test_class = classify0(group_test[i], group, labels, k)
        if test_class==label_test[i]:
            cnt+=1
    # 输出
    # print(cnt/len(group_test))
    x.append(cnt)
    y.append(index+1)

print(x)
print(y)
#展示随机生成的数据
plt.figure()
plt.axis([ 0, 8,180, 230])

plt.plot(y,x,'k.')
plt.show()


